package com.itcncp.wechat.app.rpc.service.impl;
import com.itcncp.common.annotation.BaseService;
import com.itcncp.common.base.BaseServiceImpl;
import com.itcncp.common.model.OrderCodeType;
import com.itcncp.common.util.*;
import com.itcncp.wechat.app.dao.mapper.UserAccountInfoMapper;
import com.itcncp.wechat.app.dao.mapper.UserCustomerInfoMapper;
import com.itcncp.wechat.app.dao.mapper.UserRechangeOpJnlMapper;
import com.itcncp.wechat.app.dao.model.UserAccountInfo;
import com.itcncp.wechat.app.dao.model.UserCustomerInfo;
import com.itcncp.wechat.app.dao.model.UserRechangeOpJnl;
import com.itcncp.wechat.app.dao.model.UserRechangeOpJnlExample;
import com.itcncp.wechat.app.rpc.api.UserRechangeOpJnlService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal;
import java.util.Date;

/**
* UserRechangeOpJnlService实现
* Created by itcncp on 2018/1/12.
*/
@Service
@Transactional
@BaseService
public class UserRechangeOpJnlServiceImpl extends BaseServiceImpl<UserRechangeOpJnlMapper, UserRechangeOpJnl, UserRechangeOpJnlExample>
        implements UserRechangeOpJnlService {

    private static final Logger LOGGER = LoggerFactory.getLogger(UserRechangeOpJnlServiceImpl.class);

    @Autowired
    UserRechangeOpJnlMapper userRechangeOpJnlDao;

    @Autowired
    UserAccountInfoMapper userAccountInfoDao;

    @Autowired
    UserCustomerInfoMapper userCustomerInfoDao;


    /**
     * 创建微信小程序充值订单
     * @param orderNo
     * @param userId
     * @param amount
     * @param prepayid
     * @return
     */
    @Override
    public Object wxMiniRechargeAmount(String orderNo,Long userId, BigDecimal amount,String prepayid) {

        // 创建充值订单
        UserRechangeOpJnl userRechangeOpJnl = new UserRechangeOpJnl();

        //充值订单号
        userRechangeOpJnl.setRechargeNo( new Long(orderNo) );

        //用户id
        userRechangeOpJnl.setUserId( userId );
        //充值金额
        userRechangeOpJnl.setRechargeAmount( amount );
        //实收金额
        userRechangeOpJnl.setRechargeActAmount( amount );
        //充值费率
        userRechangeOpJnl.setRechargeFee( new BigDecimal( "0" ) );
        //充值时间
        userRechangeOpJnl.setRechargeTime( new Date(  ) );
        //充值状态  1、失败； 2、成功 初始化默认位失败
        userRechangeOpJnl.setRechargeState( new Byte( "1" ) );
        //第三方订单号
        userRechangeOpJnl.setdOrderNo( "" );
        userRechangeOpJnl.setOldBalance( new BigDecimal( "0" ) );
        userRechangeOpJnl.setNowBalance( new BigDecimal( "0" ) );
        // 支付类型
        //充值方式 1、微信 2、支付宝 3、银联 4、银行卡 5、其他
        userRechangeOpJnl.setRechargeWay( new Byte( "1" ) );
        userRechangeOpJnl.setRemark(prepayid);

        userRechangeOpJnlDao.insert(userRechangeOpJnl);

        return  userRechangeOpJnl;
    }


    /**
     * 银行卡充值
     * @param userId
     * @param amount
     * @return
     */
    @Override
    public Object bankCardRechargeAmount(Long userId, BigDecimal amount) {

        // 创建充值订单
        UserRechangeOpJnl userRechangeOpJnl = new UserRechangeOpJnl();

        //充值订单号
        Long orders = OrderUtils.createOrderId( OrderCodeType.RECHARGE_NO );
        userRechangeOpJnl.setRechargeNo(orders );

        LOGGER.error("生成订单号："+userRechangeOpJnl.getRechargeNo());

        //用户id
        userRechangeOpJnl.setUserId( userId );
        //充值金额
        userRechangeOpJnl.setRechargeAmount( amount );
        //实收金额
        userRechangeOpJnl.setRechargeActAmount( amount );
        //充值费率
        userRechangeOpJnl.setRechargeFee( new BigDecimal( "0" ) );
        //充值时间
        userRechangeOpJnl.setRechargeTime( new Date(  ) );
        //充值状态  1、失败； 2、成功 初始化默认位失败
        userRechangeOpJnl.setRechargeState( new Byte( "2" ) );
        //第三方订单号
        userRechangeOpJnl.setdOrderNo( "" );
        userRechangeOpJnl.setOldBalance( new BigDecimal( "0" ) );
        userRechangeOpJnl.setNowBalance( new BigDecimal( "0" ) );
        userRechangeOpJnl.setRemark( "" );
        BigDecimal pingppAmount = amount;
        // 支付类型
        //充值方式 1、微信 2、支付宝 3、银联 4、银行卡 5、其他
        userRechangeOpJnl.setRechargeWay( new Byte( "4" ) );

        //测试使用
        //填充第三方订单号
        userRechangeOpJnl.setdOrderNo( orders.toString() );

        //查询账户资金
        UserAccountInfo userAccountInfo = userAccountInfoDao.selectByPrimaryKey( userId );
        if(null == userAccountInfo){
            return  null;
        }

        //查询用户信息
        UserCustomerInfo userInfo = userCustomerInfoDao.selectByPrimaryKey( userId );
        if(null==userInfo){
            return  null;
        }

        //充值前账户余额
        userRechangeOpJnl.setOldBalance( userAccountInfo.getAccountBalance() );
        // 充值后的金额
        BigDecimal nowBalance = userAccountInfo.getAccountBalance().add(userRechangeOpJnl.getRechargeActAmount());
        //实收金额
        userRechangeOpJnl.setNowBalance( nowBalance );

        //更新账户资金
        userAccountInfo.setAccountBalance( nowBalance );

        // 如果金额超过5元设置自动扣款 扣款方式 1非自动扣款 2自动扣款（不需要密码）
        if (userAccountInfo.getAccountBalance().intValue() > 500) {
            userInfo.setPayMethod(new Byte( "2" ));
            userInfo.setUpdateTime( new Date(  ) );
            //更新用户信息
            userCustomerInfoDao.updateByPrimaryKeySelective( userInfo );
        }


        //更新账户资金
        userAccountInfoDao.updateByPrimaryKeySelective( userAccountInfo );

        //创建保存充值订单
        userRechangeOpJnlDao.insertSelective( userRechangeOpJnl );

        return userAccountInfo;
    }


    /**
     * 微信小程序充值后回调
     * @param orderNo  系统订单号
     * @param transactionno 第三方订单号
     * @return
     */
    @Override
    public Object wxMiniRechargeCallBack(Long orderNo,String transactionno) {

        UserRechangeOpJnl userRechangeOpJnl = userRechangeOpJnlDao.selectByPrimaryKey( orderNo );

        if(null == userRechangeOpJnl){
            return  null;
        }

        //表单提交场景下，为 submit 事件带上的 formId；支付场景下，为本次支付的 prepay_id
        String formId = userRechangeOpJnl.getRemark();

        // 判断订单是否已支付
        //充值状态： 1、失败； 2、成功
        if (null != userRechangeOpJnl.getRechargeState() && userRechangeOpJnl.getRechargeState() == 2) {
            return userRechangeOpJnl;
        }
        //更改充值状态 充值状态： 1、失败； 2、成功
        userRechangeOpJnl.setRechargeState( new Byte( "2" ) );

        //填充第三方订单号
        userRechangeOpJnl.setdOrderNo( transactionno );

        Long userId = userRechangeOpJnl.getUserId();

        //查询账户资金
        UserAccountInfo userAccountInfo = userAccountInfoDao.selectByPrimaryKey( userId );
        if(null == userAccountInfo){
            return  null;
        }

        //查询用户信息
        UserCustomerInfo userInfo = userCustomerInfoDao.selectByPrimaryKey( userId );
        if(null==userInfo){
            return  null;
        }

        // 微信支付
        userRechangeOpJnl.setRechargeWay (new Byte( "1" ));

        //充值前账户余额
        userRechangeOpJnl.setOldBalance( userAccountInfo.getAccountBalance() );
        // 充值后的金额
        BigDecimal nowBalance = userAccountInfo.getAccountBalance().add(userRechangeOpJnl.getRechargeActAmount());
        //实收金额
        userRechangeOpJnl.setNowBalance( nowBalance );

        //更新账户资金
        userAccountInfo.setAccountBalance( nowBalance );

        // 如果金额超过5元设置自动扣款 扣款方式 1非自动扣款 2自动扣款（不需要密码）
        if (userAccountInfo.getAccountBalance().intValue() > 500) {
            userInfo.setPayMethod(new Byte( "2" ));
            userInfo.setUpdateTime( new Date(  ) );
            //更新用户信息
            userCustomerInfoDao.updateByPrimaryKeySelective( userInfo );
        }

        //更新充值记录
        userRechangeOpJnlDao.updateByPrimaryKeySelective( userRechangeOpJnl );

        //更新账户资金
        userAccountInfoDao.updateByPrimaryKeySelective( userAccountInfo );

//        //推送充值订单
//        if(userInfo.getLoginMode().intValue()==2){
//            //接收者（用户）的 openid
//            String openid = userInfo.getDeviceAppNo();
//            //所需下发的模板消息的id
//            String templateId = ApiConstant.WX_MINI_NOTICE_PAY_RECHARGE;
//            //点击模板卡片后的跳转页面，仅限本小程序内的页面。支持带参数,（示例index?foo=bar）。该字段不填则模板无跳转。
//            String page ="/pages/index/index";
//            //模板内容字体的颜色，不填默认黑色
//            String color = "";
//            String emphasis_keyword = "keyword1"; //模板需要放大的关键词，不填则默认无放大
//
//            WxMaTemplateMessage wxMaTemplateMessage = new WxMaTemplateMessage();
//            List<WxMaTemplateMessage.Data> tempData = new ArrayList<WxMaTemplateMessage.Data>();
//
//            BigDecimal amount = userRechangeOpJnl.getRechargeActAmount().multiply(new BigDecimal(0.01));
//            tempData.add(new WxMaTemplateMessage.Data("keyword1","ITC钱包余额充值"));
//            tempData.add(new WxMaTemplateMessage.Data("keyword2",amount+ " 元"));
//            tempData.add(new WxMaTemplateMessage.Data("keyword3",userRechangeOpJnl.getRechargeNo().toString()));
//            String rechangeTime = DateUtils.dateFormat(userRechangeOpJnl.getRechargeTime(),null);
//            tempData.add(new WxMaTemplateMessage.Data("keyword4",rechangeTime));
//            tempData.add(new WxMaTemplateMessage.Data("keyword5","欢迎使用ITC不停车收费。如对订单有疑问，请联系客服！"));
//
//            wxMaTemplateMessage.setToUser(openid);
//            wxMaTemplateMessage.setTemplateId(templateId);
//            wxMaTemplateMessage.setPage(page);
//            wxMaTemplateMessage.setFormId(formId);
//            wxMaTemplateMessage.setEmphasisKeyword(emphasis_keyword);
//            wxMaTemplateMessage.setColor(color);
//            wxMaTemplateMessage.setData(tempData);
//
//            //初始化配置
//            WxMaInMemoryConfig wxMaInMemoryConfig = new WxMaInMemoryConfig();
//            wxMaInMemoryConfig.setAppid(ApiConstant.WX_MINI_APPID);
//            wxMaInMemoryConfig.setSecret(ApiConstant.WX_MINI_APPP_SECRET);
//            wxMaInMemoryConfig.setToken(ApiConstant.WX_MINI_TOKEN);
//            wxMaInMemoryConfig.setAesKey(ApiConstant.WX_MINI_ENCODING_AESKEY);
//            WxMaConfig wxMaConfig = wxMaInMemoryConfig;
//
//            WxMaService wxMaService = new WxMaServiceImpl();
//            wxMaService.setWxMaConfig(wxMaConfig);
//
//            //发送支付订单
//            try {
//                wxMaService.getMsgService().sendTemplateMsg(wxMaTemplateMessage);
//            } catch (WxErrorException e) {
//                System.err.println("推送失败~~");
//                return new ApiResult(ApiResultConstant.FAILED,e.getError());
//            }
//        }

//        // 发送支付成功信息用户客户端
//        Jpush.notifiAccount(userInfo.getDeviceAppNo(), "ITC充值通知，充值成功，金额：" + userRechangeOpJnl.getRechargeAmount() + "元");
//
//        // 推送透传给客户端
//        rongCloud.publishSystemMessage( ApiConstant.RONGCLOUD_USERID, userInfo.getDeviceAppNo(),
//                new TxtMessage("支付成功", new ApiResult( ApiResultConstant.APP_NOTIFICATION_RECHARGE,userAccountInfo )), "支付成功", "支付成功");


        return userAccountInfo;
    }

}